import java.util.ArrayList;
import java.util.List;

public class Leetcode89 {

    public static void main(String[] args) {
        for (int i = 1; i <= 16; i++) {
            System.out.println(grayCode(i));
            System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        }
    }

    public static List<Integer> grayCode(int n) {
        if (n == 0) {
            List<Integer> res = new ArrayList<>();
            res.add(0);
            return res;
        }

        if (n == 1) {
            List<Integer> res = new ArrayList<>();
            res.add(0);
            res.add(1);
            return res;
        }

        List<Integer> parent = grayCode(n - 1);

        int size = parent.size();

        int first = 1;
        for (int i = 0; i < n - 1; i++) {
            first = first << 1;
        }

        for (int i = size - 1; i >= 0; i--) {
            parent.add(parent.get(i) + first);
        }

        return parent;
    }

}
